package icu.lingjie.run;

import icu.lingjie.util.ConfigUtil;
import icu.lingjie.灵界.灵界类;
import icu.lingjie.灵阵.灵阵类;
import static icu.lingjie.util.ConfigUtil.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
@Slf4j
public class Run {

    @Autowired
    ConfigUtil configUtil;

    灵界类 灵界;
    public 灵界类 get灵界() {
        return this.灵界;
    }

    灵阵类 灵阵;
    public 灵阵类 get灵阵(){
        return this.灵阵;
    }

    @PostConstruct
    public void init() throws Exception{
        灵界 = new 灵界类();
        灵阵 = new 灵阵类();
        灵界.初始化(灵阵);
        灵阵.初始化(灵界);

        new Thread(()->{
            log.info("准备运行，等待灵阵和灵界准备好...");
            while (!灵界.初始化好了吗){
                Thread.yield();
            }
            while (!灵阵.初始化好了吗){
                Thread.yield();
            }
            灵阵.set世界时间(灵界.get世界时间());
            Runnable[] 刷新灵界的方法 = 灵界.获取运行的方法();
            Runnable[] 刷新灵阵的方法 = 灵阵.获取运行的方法();
            for (int i = 0; i < 线程数; i++) {
                new Thread(new 运行任务类(刷新灵界的方法[i], 刷新灵阵的方法[i]),"刷新的线程_"+i).start();
            }
            log.info("开始运行~~~");
        },"刷新的线程_主线程").start();
    }

    private class 运行任务类 implements Runnable {

        private Runnable 刷新灵界的方法;
        private Runnable 刷新灵阵的方法;

        public 运行任务类(Runnable 刷新灵界的方法, Runnable 刷新灵阵的方法){
            this.刷新灵界的方法 = 刷新灵界的方法;
            this.刷新灵阵的方法 = 刷新灵阵的方法;
        }

        @Override
        public void run(){
            log.info(Thread.currentThread().getName()+" 开始运行~");
            while (true) {
                try {
                    long time = System.currentTimeMillis();
//                log.info("时间={}，开始刷新地图", 灵界.get世界时间());
                    long 下一个世界时间 = 灵界.get世界时间() + 1;
                    this.刷新灵界的方法.run();
                    while (灵界.get世界时间() != 下一个世界时间) {
                        Thread.yield();
                    }
//                log.info("时间={}，耗时={}，结束刷新地图---------------------",
//                        灵界.get世界时间(), System.currentTimeMillis()-time);
                    this.刷新灵阵的方法.run();
                    while (灵阵.get世界时间() != 下一个世界时间) {
                        Thread.yield();
                    }
//                    Thread.sleep(100_000);
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

    // 每小时保存一次
    @Scheduled(cron = "0 0 0/1 * * ?")
    public void saveFile(){
        灵界.saveMap();
    }

}
